package com.ruoyi.project.lab.service;

import com.ruoyi.common.utils.text.Convert;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.project.jiaowu.classtime.domain.TbClassTime;
import com.ruoyi.project.jiaowu.classtime.mapper.TbClassTimeMapper;
import com.ruoyi.project.lab.domain.Lab;
import com.ruoyi.project.lab.domain.LabAddParam;
import com.ruoyi.project.lab.domain.LabDateParam;
import com.ruoyi.project.lab.mapper.LabMapper;
import com.ruoyi.project.labappointment.mapper.LabAppointmentMapper;
import com.ruoyi.project.labapprove.mapper.LabApproveMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

@Service
public class LabServiceImpl implements LabService{

    @Autowired
    private LabMapper labDao;

    @Autowired
    private TbClassTimeMapper tbClassTimeMapper;

    @Autowired
    private LabAppointmentMapper labAppointmentMapper;
    @Override
    public List<Lab> selectlabList(Lab lab) {
        return labDao.selectAll(lab);
    }

    @Override
    public int insertLab(Lab lab) {
        return labDao.insertLab(lab);
    }

    @Override
    @Transactional
    public int deleteById(String ids) {
        Long[] testIds = Convert.toLongArray(ids);
        //删除实验室信息
        //删除实验室预约信息，相关实验信息，用户实验室预约表信息，还有实验室删除
        //1.删除相关实验信息  同时删除学生提交的做实验的信息
        labDao.deleteStudentExperiment(testIds);
        labDao.deleteExperiment(testIds);
        //2.删除用户实验室预约表信息
        labDao.deleteSubscribe(testIds);
        //3.删除实验室预约信息
        labDao.deleteLabDate(testIds);
        //最后删除实验室
        return labDao.deleteTestByIds(testIds);
    }

    @Override
    public Lab selectLabById(Long id) {
        return labDao.selectLabById(id);
    }

    @Override
    public int updateLab(Lab lab) {
        return labDao.updateLab(lab);
    }

    @Override
    @Transactional
    public AjaxResult addSave(LabAddParam labAddParam) {
        //所有节次 信息
        List<TbClassTime> tbClassTimes=tbClassTimeMapper.selectTbClassTimeList();
        //创建linkedList集合
        List<Long>centerLists=new LinkedList<>();
        //迭代遍历
        Iterator<TbClassTime> it = tbClassTimes.iterator();
        while (it.hasNext()) {
            long value = it.next().getSectionNumber();   //通过迭代，获取节次信息存入linked集合
            centerLists.add(value);    //centerLists最后值为[1,2,3,4,5,6]
        }
        List<LabDateParam>labDateParams=new ArrayList<>();
        //日期格式化
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        //新增实验室
        labDao.insertLabs(labAddParam);   //添加实验室信息到  tb_lab表
        //先循环有多少行   （添加节次信息到节次表）   即添加了几行日期
        for (int i = 0; i < labAddParam.getExperimentBeginDate().size(); i++) {
            try {
                //获取循环天数  即几月几号-几月几号天数
                Long diff=(df.parse(labAddParam.getExperimenEndtDate().get(i)).getTime()-df.parse(labAddParam.getExperimentBeginDate().get(i)).getTime())/ (1000 * 60 * 60 * 24);
                if(diff>=0){
                    //循环时间
                    for(int g=0;g<diff+1;g++){
                        if(labAddParam.getSectionEnd().get(i)>labAddParam.getSectionBegin().get(i)){
                            //获取需要开放节次id
                            List<Long> sectionIds=centerLists.subList(labAddParam.getSectionBegin().get(i)-1,labAddParam.getSectionEnd().get(i));
                            //节次循环(循环节次)
                            for(Long centerList:centerLists){
                                LabDateParam labDateParam=new LabDateParam();
                                //获取到添加的实验室的id
                                labDateParam.setLabId(labAddParam.getId());
                                //获取日历
                                Calendar c = Calendar.getInstance();
                                try {
                                    //获取到开放日期中第一个
                                    c.setTime(df.parse(labAddParam.getExperimentBeginDate().get(i)));
                                } catch (ParseException e) {
                                    e.printStackTrace();
                                }
                                c.add(Calendar.DATE, g);
                                labDateParam.setOrderTime(c.getTime());
                                labDateParam.setSection(centerList);
                                if(sectionIds.contains(centerList)){
                                    labDateParam.setStatus(2);
                                }else{
                                    labDateParam.setStatus(0);
                                }
                                labDateParams.add(labDateParam);
                            }
                        }else{
                            labDao.deleteById(labAddParam.getId().toString());
                            return new AjaxResult(AjaxResult.Type.ERROR,"第"+i+1+"行节次选择错误！");
                        }
                    }
                }else{
                    labDao.deleteById(labAddParam.getId().toString());
                    return new AjaxResult(AjaxResult.Type.ERROR,"第"+i+1+"行时间选择错误！");
                }
            } catch (ParseException e) {
                e.printStackTrace();
                return new AjaxResult(AjaxResult.Type.ERROR,"日期格式错误！");
            }
        }
        int count=0;
        for(LabDateParam ab:labDateParams){
            /**
             * 判断当前添加的时间节次是否重复
             */
            Long flag=tbClassTimeMapper.labDateIsExist(ab);
            if(flag!=null){
                //重复则更新状态
                tbClassTimeMapper.updateLabDateIsExist(ab);
                count++;
            }else{
                tbClassTimeMapper.insertClassTime2(ab);
                count++;
            }
        }
        if(count!=0){
            return AjaxResult.success("数据添加成功");
        }
        labDao.deleteById(labAddParam.getId().toString());
        return AjaxResult.success(AjaxResult.Type.ERROR,"添加失败！");
    }

    @Override
    public int editGuanbi(Long id) {
        return labDao.editGuanbi(id);
    }

    @Override
    public int editKaifang(Long id) {
        return labDao.editKaifang(id);
    }




    @Override
    public List<LabDateParam> getAllLabDate(LabDateParam labDateParam) {
        /*LabDateParam labDateParam=new LabDateParam();
        labDateParam.setLabId(id);*/
        return labDao.getAllLabDate(labDateParam);
    }


    @Override
    @Transactional
    public boolean updateLabDate(Map<String, Object> map) {
        labDao.updateLabDate2(map);
        return labDao.updateLabDate(map);
    }

    /**
     * 删除实验室某天开放信息
     * @param labDateParam
     * @return
     */
    @Override
    @Transactional
    public boolean deleteLabDateByTime(LabDateParam labDateParam) {
        return labDao.deleteLabDateByTime(labDateParam);
    }


    /**
     * 获取当天所有节次的预约情况
     * @param labDateParam
     * @return
     */
    @Override
    public List<Integer> selectLabDate(LabDateParam labDateParam) {
        return labDao.selectLabDate(labDateParam);
    }
}
